/*
 * @lc app=leetcode.cn id=3 lang=javascript
 *
 * [3] 无重复字符的最长子串
 *
 * https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/description/
 *
 * algorithms
 * Medium (30.40%)
 * Likes:    2077
 * Dislikes: 0
 * Total Accepted:    161.2K
 * Total Submissions: 530.3K
 * Testcase Example:  '"abcabcbb"'
 *
 * 给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。
 * 
 * 示例 1:
 * 
 * 输入: "abcabcbb"
 * 输出: 3 
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 
 * 
 * 示例 2:
 * 
 * 输入: "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 * 
 * 
 * 示例 3:
 * 
 * 输入: "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
 * 请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 * 
 * 
 */
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    if (!s) return 0
    let window = new Set()
    let i = 0, j = 0, re = 0, n = s.length
    while(i < n && j < n) {
        if (!window.has(s[j])) {
            window.add(s[j++])
            re = Math.max(re, j - i)
        } else {
            window.delete(s[i++])
        }
    }
    return re
};

// hash表 双指针
var lengthOfLongestSubstring1 = function(s) {
    let hash = {}, ans = 0
    for (let l = 0, r = 0; r < s.length; r++) {
        let c = s[r]
        if (!(c in hash)) hash[c] = r
        else {
            l = hash[c] + 1
            hash[c] = r
        }
        ans = Math.max(ans, r - l + 1)
    }
    return ans
};

let str = "abba"
lengthOfLongestSubstring1(str)

